<html>
<script>

var Singleton = function() { 
 var attr = 1, fn = function(){ console.log("I am executed in closure");}; 
 return { 
   method : function(){ fn(); }, 
   getAttr : function(){ console.log("will be returned: " + attr ); return attr; } 
 }; 
}(); 

Singleton.method(); 
Singleton.getAttr(); 


var LazySingleton = function(){ 
var attr = 2, fn = function(){ console.log("I am LazySingleton function");}; 
var obj = { 
method : function(){ fn(); }, 
getAttr : function(){ return attr; } 
}; 
function init(){ 
return obj; 
} 
return { getInstance: init}; 
}(); 


LazySingleton.getInstance().method(); 
console.log("LazySingleton: " + LazySingleton.getInstance().getAttr()); 

function Universe() {

    if (typeof Universe.instance === 'object') {
        return Universe.instance;
    }

    this.start_time = 0;
    this.bang = "Big";

    Universe.instance = this;
    // return this implicitly
}

// test
var uni = new Universe();
var uni2 = new Universe();
console.log(uni === uni2); // true

function Universe2() {
    // instance cached
    var instance = this;

    this.start_time = 0;
    this.bang = "Big";
    Universe2 = function () {
        return instance;
    };
}

var un1i = new Universe2();
var un1i2 = new Universe2();
un1i.bang = "123";
console.log(un1i === un1i2); // true
console.log(un1i2.bang); // 123

var Universe3;
(function () {
    var instance;
    Universe3 = function Universe3() {
        if (instance) {
            return instance;
        }
        instance = this;

        this.start_time = 0;
        this.bang = "Big";
    };
} ());

var a = new Universe3();
var b = new Universe3();
alert(a === b); // true
a.bang = "123";
alert(b.bang); // 123

</script>
</html>